package ninth.同步与死锁.使用同步解决问题;

/**
 * 解决资源共享的同步操作 可以用同步代码块和同步方法两种方式完成
 *  前面说过，代码块是指用“{}"包裹起来的一段代码，根据其位置和声明的不同，可以分为普通代码块、构造块、静态块3种
 *  如果在代码块上加上 synchronized关键字 则此代码块就成为同步代码块。
 *
 *  同步代码块格式：
 *  synchronized(同步对象){
 *      需要同步的代码
 *  }
 *  在使用同步代码块的时候必须指定一个需要同步的对象，但一般都将当前对象(this)设置成同步对象
 */
class MT1 implements Runnable {
    private int ticket = 5;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (this) {
                if (ticket > 0) {
                    try {
                        Thread.sleep(300);// 加入延迟
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    System.out.println("卖票：ticket=" + ticket--);
                }
            }

        }
    }
}

public class 使用同步代码块解决以上的同步问题 {
    public static void main(String[] args) {
        MT1 mt = new MT1();// 定义线程对象
        Thread t1 = new Thread(mt);// 定义THread对象
        Thread t2 = new Thread(mt);// 定义THread对象
        Thread t3 = new Thread(mt);// 定义THread对象
        t1.start();
        t2.start();
        t3.start();

    }
}


/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=58864:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 ninth.同步与死锁.使用同步解决问题.使用同步代码块解决以上的同步问题
卖票：ticket=5
卖票：ticket=4
卖票：ticket=3
卖票：ticket=2
卖票：ticket=1

Process finished with exit code 0
 */